package com.agua.enturno.servicios.impl;

import com.agua.enturno.excepciones.ExcepcionDeReglaDelNegocio;
import com.agua.enturno.modelo.agenda.JornadaLaboralHabitual;
import com.agua.enturno.persistencia.dao.JornadaLaboralHabitualDAO;
import com.agua.enturno.servicios.JornadaLaboralHabitualService;
import com.agua.enturno.util.DayOfWeekTime;
import com.agua.enturno.vista.dto.HorarioDTO;
import com.agua.enturno.vista.dto.HorarioFullDTO;
import com.agua.enturno.vista.dto.JornadaLaboralHabitualDTO;
import com.agua.enturno.vista.dto.assemblers.HorarioAssembler;
import com.agua.enturno.vista.dto.assemblers.HorarioFullAssembler;
import com.agua.enturno.vista.dto.assemblers.JornadaLaboralHabitualAssembler;
import org.joda.time.Duration;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public class JornadaLaboralHabitualServiceImpl implements JornadaLaboralHabitualService {

	private JornadaLaboralHabitualDAO jornadaLaboralHabitualDAO;
	private JornadaLaboralHabitualAssembler jornadaLaboralHabitualAssembler;
	private HorarioAssembler horarioAssembler;
	private HorarioFullAssembler horarioFullAssembler;
	
	
	/*------------------------------------ Public methods ----------------------------------*/

	@Override
	@Transactional
	public JornadaLaboralHabitualDTO findById(Long jornadaId) {
		return jornadaLaboralHabitualAssembler.assemble(jornadaLaboralHabitualDAO.findById(jornadaId));
	}
	
	@Override
	@Transactional
	public List<HorarioDTO> findHorarios(Long jornadaId) {
		return horarioAssembler.assemble(jornadaLaboralHabitualDAO.findById(jornadaId).getHorarios());
	}
	
	@Override
	@Transactional
	public List<HorarioFullDTO> findHorariosFull(Long jornadaId) {
		return horarioFullAssembler.assemble(jornadaLaboralHabitualDAO.findById(jornadaId).getHorarios());
	}
	
	@Override
	@Transactional
	public void modificarJornada(Long jornadaId, JornadaLaboralHabitualDTO jornadaHabitualModificadaDTO, String motivo) throws ExcepcionDeReglaDelNegocio {

		JornadaLaboralHabitual jornadaHabitual = jornadaLaboralHabitualDAO.findById(jornadaId);
		jornadaHabitual.modificarIntervalos(jornadaHabitualModificadaDTO.getDiaYHoraDeInicio(), jornadaHabitualModificadaDTO.getDiaYHoraDeFin(), motivo);
		jornadaHabitual.modificarDuracionDeLosTurnos(jornadaHabitualModificadaDTO.getDuracionDeLosTurnos());
		jornadaHabitual.modificarVacantesPorTurno(jornadaHabitualModificadaDTO.getVacantesPorTurno(), motivo);
	}
	
	@Override
	@Transactional
	public void modificarIntervalos(Long jornadaId, DayOfWeekTime nuevoDiaYHoraDeInicio, DayOfWeekTime nuevoDiaYHoraDeFin, String motivo) throws ExcepcionDeReglaDelNegocio {
		JornadaLaboralHabitual jornadaHabitual = jornadaLaboralHabitualDAO.findById(jornadaId);
		jornadaHabitual.modificarIntervalos(nuevoDiaYHoraDeInicio, nuevoDiaYHoraDeFin, motivo);
	}
	
	@Override
	@Transactional
	public void modificarDuracionDeLosTurnos(Long jornadaId, Duration nuevaDuracion) throws ExcepcionDeReglaDelNegocio {
		JornadaLaboralHabitual jornadaHabitual = jornadaLaboralHabitualDAO.findById(jornadaId);
		jornadaHabitual.modificarDuracionDeLosTurnos(nuevaDuracion);
	}
	
	@Override
	@Transactional
	public void agregarVacantesPorTurno(Long jornadaId, Integer vacantesAAgregar) throws ExcepcionDeReglaDelNegocio {
		JornadaLaboralHabitual jornadaHabitual = jornadaLaboralHabitualDAO.findById(jornadaId);
		jornadaHabitual.agregarVacantesPorTurno(vacantesAAgregar);
	}

	@Override
	@Transactional
	public void quitarVacantesPorTurno(Long jornadaId, Integer vacantesAQuitar, String motivo) throws ExcepcionDeReglaDelNegocio {
		JornadaLaboralHabitual jornadaHabitual = jornadaLaboralHabitualDAO.findById(jornadaId);
		jornadaHabitual.quitarVacantesPorTurno(vacantesAQuitar, motivo);
	}
	
	/*--------------------------------------------------------------------------------------*/
	/*---------------------------------- Geters and seters ---------------------------------*/

	public void setJornadaLaboralHabitualDAO(JornadaLaboralHabitualDAO jornadaLaboralHabitualDAO) {
		this.jornadaLaboralHabitualDAO = jornadaLaboralHabitualDAO;
	}

	public void setJornadaLaboralHabitualAssembler(JornadaLaboralHabitualAssembler jornadaLaboralHabitualAssembler) {
		this.jornadaLaboralHabitualAssembler = jornadaLaboralHabitualAssembler;
	}

	public void setHorarioAssembler(HorarioAssembler horarioAssembler) {
		this.horarioAssembler = horarioAssembler;
	}

	public void setHorarioFullAssembler(HorarioFullAssembler horarioFullAssembler) {
		this.horarioFullAssembler = horarioFullAssembler;
	}
	
	/*--------------------------------------------------------------------------------------*/

}
